package com.catmiao.spark.rdd.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @title: RDD_Operator_01_transform
 * @projectName spark_study
 * @description: TODO
 * @author ChengMiao
 * @date 2024/2/2 11:48
 */
object RDD_Operator_06_transform {

  def main(args: Array[String]): Unit = {
    val sparkCon = new SparkConf().setMaster("local[*]").setAppName("rdd")

    val sparkContext = new SparkContext(sparkCon)


    // 转换算子 groupBy
    val rdd: RDD[Int] = sparkContext.makeRDD(List(1, 2, 3, 4,5,6,7), 2)


    /**
     * groupBy 会将数据源中的每一个数据进行分组判断，根据返回的分组Key进行分组
     * 相同key的值会放置在一个组中
     */
    def groupByFun(num: Int) = {
      num % 2
    }


    /**
     * 分组和分区没有必然关系
     * groupBy会将数据打乱，重新组合，这个操作称为Shuffle，极限情况下，数据可能被分在一个分区中
     * 一个组的数据在一个分区中，但并不是一个分区中只有一个组
     */
    val groupRdd : RDD[(Int,Iterable[Int])] = rdd.groupBy(groupByFun)

    groupRdd.collect().foreach(
      tuple => {
        println(tuple.toString())
      }
    )

    sparkContext.stop()
  }

}
